package com.swinginwind.flexutils.functions
{
	import flash.net.URLRequestMethod;
	
	import mx.controls.DataGrid;
	
	/**
	 * @author jimmy
	 * @E-mail: swinginwind@gmail.com
	 * @version 1.0.0
	 * 创建时间：2013-6-23 下午1:03:39
	 * 
	 */
	public class ExcelTool
	{
		public function ExcelTool()
		{
		}
		
		
		
		/**
		 * Simple script to convert a Datagrid to a HTML table and then 
		 * pass it on to an external excel exporter
		 *
		 */    
		
		//Libs that are mostly used 
		//(only a number are necessary for the datagrid conversion and export)
		import flash.errors.*;
		import flash.events.*;
		import flash.external.*;
		import flash.net.URLRequest;
		import flash.net.URLVariables;
		import flash.net.navigateToURL;
		
		/**
		 * Convert the datagrid to a html table
		 * Styling etc. can be done externally
		 * 
		 * @param: dg Datagrid Contains the datagrid that needs to be converted
		 * @returns: String
		 */
		public static function convertDGToHTMLTable(dg:DataGrid):String {
			//Set default values
			var font:String = dg.getStyle('fontFamily');
			var size:String = dg.getStyle('fontSize');
			var str:String = '';
			var colors:String = '';
			var style:String = 'style="font-family:'+font+';font-size:'+size+'pt;"';				
			var hcolor:Array;
			
			//Retrieve the headercolor
			if(dg.getStyle("headerColor") != undefined) {
				hcolor = [dg.getStyle("headerColor")];
			} else {
				hcolor = dg.getStyle("headerColors");
			}				
			
			//Set the htmltabel based upon knowlegde from the datagrid
			str+= '<table width="'+dg.width+'" border="1"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">';
			
			//Set the tableheader data (retrieves information from the datagrid header				
			for(var i:int = 0;i<dg.columns.length;i++) {
				colors = dg.getStyle("themeColor");
				
				if(dg.columns[i].headerText != undefined) {
					str+="<th "+style+">"+dg.columns[i].headerText+"</th>";
				} else {
					str+= "<th "+style+">"+dg.columns[i].dataField+"</th>";
				}
			}
			str += "</tr></thead><tbody>";
			colors = dg.getStyle("alternatingItemColors");
			
			//Loop through the records in the dataprovider and 
			//insert the column information into the table
			for(var j:int =0;j<dg.dataProvider.length;j++) {					
				str+="<tr width=\""+Math.ceil(dg.width)+"\">";
				
				for(var k:int=0; k < dg.columns.length; k++) {
					
					//Do we still have a valid item?						
					if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {
						
						//Check to see if the user specified a labelfunction which we must
						//use instead of the dataField
						var label:String = "";
						if(dg.columns[k].labelFunction != undefined)
							label = dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j), dg.columns[k].dataField);
						else
							label = dg.dataProvider.getItemAt(j)[dg.columns[k].dataField];
						if(label == null || label == "undefined")
							label = "";
						
						str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+ label +"</td>";
					}
				}
				str += "</tr>";
				
			}
			str += "</tbody></table>";
			
			return str;
		}
		
		/**
		 * Load a specific datagrid into Excel
		 * This method passes the htmltable string to an backend script which then
		 * offers the excel download to the user.
		 * The reason for not using a copy to clipboard and then javascript to
		 * insert it into Excel is that this mostly will fail because of the user
		 * setup (Webbrowser configuration).
		 * 
		 * @params: dg Datagrid The Datagrid that will be loaded into Excel
		 * @params: url String The location of the excel export file
		 */
		public static function loadDGInExcel(dg:DataGrid,url:String, parameters:Object=null):void {
			
			//Pass the htmltable in a variable so that it can be delivered
			//to the backend script
			var variables:URLVariables = new URLVariables(); 
			variables.htmltable	= encodeURIComponent(convertDGToHTMLTable(dg));
			for(var key:String in parameters)
			{
				variables[key] = encodeURIComponent(parameters[key]);
			}
			//Setup a new request and make sure that we are 
			//sending the data through a post
			var u:URLRequest = new URLRequest(url);
			u.data = variables; //Pass the variables
			u.method = URLRequestMethod.POST; //Don't forget that we need to send as POST
			
			//Navigate to the script
			//We can use _self here, since the script will through a filedownload header
			//which results in offering a download to the user (and still remaining in you Flex app.)
			navigateToURL(u,"_self");
		}       
		
		
		
	}
}